/*
 * Fichier : Serveur.java
 * Version : 1.0.0
 * Auteurs : Alexandre BOURSIER & Nolan POTIER
 * 
 * Description : Classe modélisant le comportement du serveur 
 */
package club.jeux.session;

import club.jeux.common.Jeu_PFC;
import club.jeux.persistence.Joueur;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.ConcurrencyManagement;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.persistence.EntityManager;
import javax.persistence.Query;

@Singleton
@Startup
@ConcurrencyManagement()
public class Serveur implements ServeurLocal {

    @javax.persistence.PersistenceContext(unitName="persistence")
    private EntityManager em ;
    
    // Définir la liste de joueurs connectés
    private ArrayList<Joueur>  joueurs;
    
    /**
     * Constructeur par défaut
     */
     public Serveur(){
       Jeu_PFC.getInstance();
       joueurs = new ArrayList<Joueur>();
    }
        
    /**
     * Vérifier l'iexistence d'un joueur 
     * @param login le login cible
     * @param pwd le mot de passe associé
     * @return la liste de sjoueurs pour le couple {login,mot de passe}
     */
    @Override
    @Lock(LockType.READ)
    public List<Joueur> verificationJoueur(String login, String pwd) {
            Query query =em.createNamedQuery("findPlayer").setParameter("login", login).setParameter("password",Joueur.stringToPwd(pwd));
            List<Joueur> j = query.getResultList();
            return j;           
    }

    /**
     * Connecter un joueur
     * @param login le login cible
     * @param pwd le mot de passe cible
     * @return le joueur courant qui se connecte
     */
    @Override
    @Lock(LockType.WRITE)
    public Joueur connexion(String login, String pwd){
        Joueur joueur=null;
        List<Joueur> j = verificationJoueur(login, pwd);
        if(!j.isEmpty()){
            if(j.size()==1){
                joueur=j.get(0);
            }              
        }
        return joueur;
    }

    /**
     * Déconnecter un joueur
     * @param j le oueur cible
     * @return true si le joueur est bien déconnecté, false sinon
     */
    @Override
    @Lock(LockType.WRITE)
    public boolean deconnexion(Joueur j){
        return joueurs.remove(j);
    }

    /**
     * Inscrire un nouveau joueur 
     * @param login le login cible
     * @param pwd le mot de passe cible
     * @param mail l'email cible
     * @return true si le joueur est inscrit, false sinon (le joueur existe déjà)
     */
    @Override
    @Lock(LockType.WRITE)
    public boolean inscription(String login, String pwd, String mail){
        boolean flag= false;
        Query query = em.createNamedQuery("findLogin").setParameter("login", login);
        List<Joueur> j = query.getResultList();
        if(j.isEmpty()){
            Joueur joueur = new Joueur(login, pwd, mail);
            em.persist(joueur);
            flag=true;
        }
        return flag;
    }
    
    /**
     * Fusionne l'état de l'entité donnée dans le contexte de persistence courant
     * @param j le joueur cible
     */
    @Override
    @Lock(LockType.WRITE)
    public void merge(Joueur j){
       em.merge(j);
    }

    /**
     * @return le joueur cible
     */
    @Override
    @Lock(LockType.READ)
    public ArrayList<Joueur> getJoueur() {
        return joueurs;
    }

    /**
     * Ajouter un joueur à la liste des joueurs connectés
     * @param j le nouveau joueur cible
     */
    @Override
    @Lock(LockType.WRITE)
    public void ajouterJoueur(Joueur j) {
       joueurs.add(j);
    }
    
   
}
